#!/usr/bin/env python
#
#       This is a program for all ADC Module. It 
#   convert analog singnal to digital signal.
#
#       This program is most analog signal modules' 
#   dependency. Use it like this:
#       `import ADC0832`
#       `sig = ADC0832.getResult(chn)`
#
#   *'chn' should be 0 or 1 represent for ch0 or ch1
#   on ADC0832
#       
#         ACD1302                 Pi
#           CS ---------------- Pin 11
#           CLK --------------- Pin 12
#           DI ---------------- Pin 13

#           VCC ----------------- 3.3V
#           GND ------------------ GND
#

import RPi.GPIO as GPIO
import wiringpi
import time

ADC_CS  = 17 #11
ADC_CLK = 18 #12
ADC_DIO = 27 #13
usdelay = 2 # max CLK frequency is 400KHz, here set duty as 2*2us
T_convert = 8*2*usdelay # ADC convert time

# using default pins for backwards compatibility
def setup(cs=17,clk=18,dio=27): #11,12,13
    global ADC_CS, ADC_CLK, ADC_DIO
    ADC_CS=cs
    ADC_CLK=clk
    ADC_DIO=dio
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)          # Number GPIOs by its physical location
    GPIO.setup(ADC_CS, GPIO.OUT)        # Set pins' mode is output
    GPIO.setup(ADC_CLK, GPIO.OUT)       # Set pins' mode is output

def destroy():
    GPIO.cleanup()

# using channel = 0 as default for backwards compatibility
def getResult(channel=0):                   # Get ADC result, input channal
    GPIO.setup(ADC_DIO, GPIO.OUT)
    GPIO.output(ADC_CS, 0)
        
    GPIO.output(ADC_CLK, 0)
    GPIO.output(ADC_DIO, 1);  wiringpi.delayMicroseconds(usdelay)
    
    GPIO.output(ADC_CLK, 1);  wiringpi.delayMicroseconds(usdelay)
    
    GPIO.output(ADC_CLK, 0)
    GPIO.output(ADC_DIO, 1);  wiringpi.delayMicroseconds(usdelay)
    
    GPIO.output(ADC_CLK, 1);  wiringpi.delayMicroseconds(usdelay)
    
    GPIO.output(ADC_CLK, 0)
    GPIO.output(ADC_DIO, channel);  wiringpi.delayMicroseconds(usdelay)
    
    GPIO.output(ADC_CLK, 1);  wiringpi.delayMicroseconds(usdelay)
    
    GPIO.output(ADC_CLK, 0)
    GPIO.setup(ADC_DIO, GPIO.IN);  wiringpi.delayMicroseconds(T_convert)
    
    dat1 = 0
    for i in range(0, 8):
        GPIO.output(ADC_CLK, 1);  wiringpi.delayMicroseconds(usdelay)
        GPIO.output(ADC_CLK, 0);  wiringpi.delayMicroseconds(usdelay)        
        dat1 = dat1 << 1 | GPIO.input(ADC_DIO)  
    
    dat2 = 0
    for i in range(0, 8):
        dat2 = dat2 | GPIO.input(ADC_DIO) << i
        GPIO.output(ADC_CLK, 1);  wiringpi.delayMicroseconds(usdelay)
        GPIO.output(ADC_CLK, 0);  wiringpi.delayMicroseconds(usdelay)
        
    GPIO.output(ADC_CLK, 1)
    GPIO.output(ADC_CS, 1);  wiringpi.delayMicroseconds(usdelay)
    GPIO.output(ADC_CLK, 0);  wiringpi.delayMicroseconds(usdelay)
    
    if dat1 == dat2:
        return dat1
    else:
        return 0

def loop():
    while True:
        res0 = getResult(0)
        res1 = getResult(1)
        print ('res0 = %d, res1 = %d' % (res0,res1))
        time.sleep(0.4)

if __name__ == '__main__':      # Program start from here
    setup()
    try:
        loop()
    except KeyboardInterrupt:   # When 'Ctrl+C' is pressed, the child program destroy() will be  executed.
        destroy()

